25 印度对外贸易的探索性研究
25.1 引言贸易数据分析的重要性
对外贸易分析:
- 贸易伙伴: 识别主要进出口国
- 贸易趋势: 了解贸易发展方向
- 政策制定: 基于数据的贸易政策
25.2 本章学习目标
本章以印度2010—2018年进出口贸易数据为例,练习长表面板数据的重塑与多国趋势对比。通过本章学习,你将掌握:
- 长表面板数据(国家-年份-贸易额)的读取与结构检查
- 用
pd.pivot_table把长表转成”国家×年份”宽表,便于按国家取行绘图 - 用
.loc按国家标签提取单行时间序列并绘制趋势折线 - 用
subplot(221)~subplot(224)组织2×2子图,对比多个贸易伙伴 - 从进出口双向趋势中区分”稳步增长型”与”波动型”伙伴
25.3 数据准备
# 注:sk2018-2010_export.csv 和 sk2018-2010_import.csv 数据文件本地没有,但平台已经内置
# =============================================================================
# 题目:印度对外贸易数据读取与透视表构建
# =============================================================================
# 本代码块实现印度进出口贸易数据的读取和初步整理
# 通过透视表构建,将数据按国家和年份进行重排,便于后续趋势分析
# ==================== 导入数据分析与可视化库 ====================
import pandas as pd # 导入Pandas库,用于数据表操作和分析
import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图
from IPython.display import display, Markdown # 导入显示工具,用于富文本输出
# ==================== 设置中文字体支持 ====================
plt.rcParams['font.sans-serif'] = ['Source Han Serif SC', 'SimHei'] # 规范字体在前,SimHei 仅作后备 # 设置绘图时的中文字体为黑体,避免中文显示为方框
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
# ==================== 读取进出口贸易数据 ====================
df_export = pd.read_csv('sk2018-2010_export.csv') # 读取2010-2018年印度出口数据,包含国家、年份、贸易额等字段
df_import = pd.read_csv('sk2018-2010_import.csv') # 读取2010-2018年印度进口数据,包含国家、年份、贸易额等字段
print('出口数据形状:', df_export.shape) # 输出出口数据集的行数和列数,了解数据规模
print('进口数据形状:', df_import.shape) # 输出进口数据集的行数和列数,了解数据规模
# ==================== 构建出口透视表 ====================
exp_country_table = pd.pivot_table(
df_export, # 以出口数据为源数据
values='value', # 透视表的值为贸易额(value字段)
index='country', # 行索引为国家,便于观察各国家趋势
columns='year' # 列为年份,便于观察时间序列变化
)
# ==================== 构建进口透视表 ====================
imp_country_table = pd.pivot_table(
df_import, # 以进口数据为源数据
values='value', # 透视表的值为贸易额(value字段)
index='country', # 行索引为国家
columns='year' # 列为年份
)
print('\n出口透视表:') # 输出标题
print(exp_country_table.head()) # 显示出口透视表的前5行,预览数据结构25.4 出口趋势分析
文件名提示:平台题面中的文件名 sk2018-2010_export.csv 与 sk2018-2010_import.csv 疑为 sk2010-2018_export.csv / sk2010-2018_import.csv 之误写——数据实际覆盖2010—2018年(见块内图题的年份区间),本章前后两个代码块均沿用题面文件名,请以平台题面与平台内置文件的实际命名为准。
任务要求:读取平台内置的印度进出口数据,构建”国家×年份”透视表;定义 bold 函数以Markdown加粗输出小节标题;在2×2子图中分别绘制对美国、阿联酋、中国、香港的出口趋势(紫色线),以及从美国、阿联酋、中国、沙特阿拉伯的进口趋势(珊瑚色线),并将两幅图分别保存为图形文件。
# 注:sk2018-2010_export.csv 和 sk2018-2010_import.csv 数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd # 导入Pandas数据分析库
import numpy as np # 导入NumPy数值计算库
import matplotlib.pyplot as plt # 导入Matplotlib绘图库
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体作为默认字体以支持中文
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
from IPython.display import display, Markdown # 导入display,模块
#定义加粗显示函数
def bold(string):
display(Markdown(string)) # 以Markdown格式渲染输出描述性文本
#读取进出口数据
df_export = pd.read_csv('sk2018-2010_export.csv')
df_import = pd.read_csv('sk2018-2010_import.csv') # 从CSV文件读取数据存入df_import
# 创建透视表exp_country_table
exp_country_table = pd.pivot_table(df_export, values = 'value', index = 'country', columns = 'year')
# 创建透视表imp_country_table
imp_country_table = pd.pivot_table(df_import, values = 'value', index = 'country', columns = 'year')
bold('**2010年至2018年印度对外贸易出口方向的趋势**') # 以粗体Markdown格式输出:2010年至2018年印度对外贸易出口方向的趋势
plt.figure(figsize=(15,10)) # 创建图形画布
plt.subplot(221) # 选择子图位置
g = exp_country_table.loc["U S A"].plot(color='purple', linewidth=3) # 按标签索引提取数据
g.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g.set_title('对美国出口的趋势', size = 15) # 设置图表标题
plt.subplot(222) # 选择子图位置
g1 = exp_country_table.loc["U ARAB EMTS"].plot(color='purple', linewidth=3) # 按标签索引提取数据
g1.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g1.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g1.set_title('对阿联酋出口的趋势', size = 15) # 设置图表标题
plt.subplot(223) # 选择子图位置
g2 = exp_country_table.loc["CHINA P RP"].plot(color='purple', linewidth=3) # 按标签索引提取数据
g2.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g2.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g2.set_title('对中国出口的趋势', size = 15) # 设置图表标题
plt.subplot(224) # 选择子图位置
g3 = exp_country_table.loc["HONG KONG"].plot(color='purple', linewidth=3) # 按标签索引提取数据
g3.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g3.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g3.set_title('对香港出口的趋势', size = 15) # 设置图表标题
plt.subplots_adjust(hspace = 0.4) # 调整子图间距
plt.savefig("5.png") # 保存图形至文件
bold('**2010年至2018年印度对外贸易进口方向的趋势**') # 以粗体Markdown格式输出:2010年至2018年印度对外贸易进口方向的趋势
plt.figure(figsize=(15,10)) # 创建图形画布
plt.subplot(221) # 选择子图位置
g = imp_country_table.loc["U S A"].plot(color='coral', linewidth=3) # 按标签索引提取数据
g.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g.set_title('从美国进口的趋势', size = 15) # 设置图表标题
plt.subplot(222) # 选择子图位置
g1 = imp_country_table.loc["U ARAB EMTS"].plot(color='coral', linewidth=3) # 按标签索引提取数据
g1.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g1.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g1.set_title('从阿联酋进口的趋势', size = 15) # 设置图表标题
plt.subplot(223) # 选择子图位置
g2 = imp_country_table.loc["CHINA P RP"].plot(color='coral', linewidth=3) # 按标签索引提取数据
g2.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g2.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g2.set_title('从中国进口的趋势', size = 15) # 设置图表标题
plt.subplot(224) # 选择子图位置
g3 = imp_country_table.loc["SAUDI ARAB"].plot(color='coral', linewidth=3) # 按标签索引提取数据
g3.set_ylabel('USD (millions)', fontsize = 12) # 设置Y轴标签
g3.set_xlabel('Year', fontsize = 12) # 设置X轴标签
g3.set_title('从沙特阿拉伯进口的趋势', size = 15) # 设置图表标题
plt.subplots_adjust(hspace = 0.4) # 调整子图间距
plt.savefig("6.png") # 保存图形至文件预期输出:数据文件平台内置,本地无数据,具体数值以平台运行结果为准。判读要点:
- 文本输出:加粗的Markdown小节标题,以及(前一块)数据形状与出口透视表前几行——确认宽表的行是国家、列是年份。
- 图形输出(5.png、6.png):出口、进口各一幅2×2子图,纵轴单位为百万美元。判读要点:每条曲线的总体方向(稳步上行、震荡、回落)与拐点年份;同一伙伴(如美国、中国)在出口图与进口图中的趋势对照。
- 图题与轴标签为英文,属于平台原始代码原样内容;读图时以曲线形态为主,不依赖标题语言。
25.5 进口趋势分析
# 注:该代码块依赖的数据来自上方平台任务代码块,本块承接上方平台任务的代码与数据(变量沿用平台任务)
bold('**2010年至2018年印度对外贸易进口方向的趋势**') # 显示章节标题
# ==================== 创建2x2子图布局 ====================
fig, axes = plt.subplots(2, 2, figsize=(15, 10)) # 创建4个子图,用于展示4个主要进口来源国的趋势
# ==================== 绘制从美国进口趋势图 ====================
imp_country_table.loc['U S A'].plot( # 选择从美国进口的数据
ax=axes[0, 0], # 绘制在第一行第一列
color='coral', # 设置线条颜色为珊瑚色,与出口的紫色形成对比
linewidth=3 # 设置线宽
)
axes[0, 0].set_ylabel('USD (millions)', fontsize=12) # 设置y轴标签
axes[0, 0].set_xlabel('Year', fontsize=12) # 设置x轴标签
axes[0, 0].set_title('从美国进口的趋势', size=15) # 设置子图标题
# ==================== 绘制从阿联酋进口趋势图 ====================
imp_country_table.loc['U ARAB EMTS'].plot( # 选择从阿联酋进口的数据
ax=axes[0, 1], # 绘制在第一行第二列
color='coral', # 使用珊瑚色,保持一致性
linewidth=3 # 设置线宽
)
axes[0, 1].set_ylabel('USD (millions)', fontsize=12) # 设置y轴标签
axes[0, 1].set_xlabel('Year', fontsize=12) # 设置x轴标签
axes[0, 1].set_title('从阿联酋进口的趋势', size=15) # 设置子图标题
# ==================== 绘制从中国进口趋势图 ====================
imp_country_table.loc['CHINA P RP'].plot( # 选择从中国进口的数据
ax=axes[1, 0], # 绘制在第二行第一列
color='coral', # 使用珊瑚色
linewidth=3 # 设置线宽
)
axes[1, 0].set_ylabel('USD (millions)', fontsize=12) # 设置y轴标签
axes[1, 0].set_xlabel('Year', fontsize=12) # 设置x轴标签
axes[1, 0].set_title('从中国进口的趋势', size=15) # 设置子图标题
# ==================== 绘制从沙特阿拉伯进口趋势图 ====================
imp_country_table.loc['SAUDI ARAB'].plot( # 选择从沙特阿拉伯进口的数据
ax=axes[1, 1], # 绘制在第二行第二列
color='coral', # 使用珊瑚色
linewidth=3 # 设置线宽
)
axes[1, 1].set_ylabel('USD (millions)', fontsize=12) # 设置y轴标签
axes[1, 1].set_xlabel('Year', fontsize=12) # 设置x轴标签
axes[1, 1].set_title('从沙特阿拉伯进口的趋势', size=15) # 设置子图标题
# ==================== 调整子图间距并显示 ====================
plt.subplots_adjust(hspace=0.4) # 设置子图垂直间距
plt.tight_layout() # 自动调整布局
plt.show() # 显示图形25.6 分析结论
出口趋势:
- 对美国、中国出口稳步增长
- 阿联酋和香港有所波动
进口趋势:
- 从中国进口持续增长
- 能源进口(阿联酋、沙特)受油价影响
25.7 本章小结
本章新增的技能要点:
- 长表转宽表是趋势分析的前置:
pd.pivot_table(values='value', index='country', columns='year')一行完成”国家×年份”重排。 - 画单个国家趋势 = 宽表按行取数:
exp_country_table.loc['U S A']取出一行年份序列后直接交给plot。 - 多子图布局:
subplot(22x)的位置编号,配合subplots_adjust(hspace=...)控制纵向间距;新一代写法fig, axes = plt.subplots(2, 2)与之等价。 - 双色编码区分口径:出口用紫色、进口用珊瑚色,同一伙伴在两幅图中并列对照,避免孤立解读单边数据。
- 题面细节存疑时的诚实处理:文件名疑为笔误时保留原样并加注说明,以平台题面为准。
易错点:
pd.pivot_table默认aggfunc='mean':要总和必须显式写aggfunc='sum';同一”国家×年份”存在重复记录时,默认取均值而非求和.loc['USA']、.loc['中国']这类写法会抛KeyError:行标签必须与平台数据逐字符一致,如U S A、CHINA P RP、U ARAB EMTS- 自行把文件名”纠正”为
sk2010-2018_export.csv:平台按题面原文件名内置文件,疑为笔误也应原样沿用,以平台题面与内置文件实际命名为准 - 增长榜只报倍数不报期末值:小基数国家容易翻出高倍数;某国期初或期末缺失时相除得
NaN且被排到表尾,下结论前先确认数据完整性 - 只看出口或只看进口单边曲线就下结论:金额上行可能是价格(油价)效应而非需求扩张,应双边对照并分清金额与数量口径
subplot(221)的三位编号是”行数-列数-序号”,序号从1起按行排布;误当坐标或从0数起会把子图画错位置
25.8 动手与思考
以下练习每题附参考答案(默认折叠);概念题与变式题可对照自查,商业判断题不设唯一答案,判断依据与口径比结论更重要。
概念辨析:
pd.pivot_table与groupby+unstack都能完成”国家×年份”重排,两者在聚合函数与缺失值处理上的默认行为有何不同?对本章数据可能造成什么差别?参考答案(点开前请先独立完成)
解题思路:聚合函数上,
pd.pivot_table的默认aggfunc='mean'(要求总和必须显式写aggfunc='sum'),而groupby没有默认聚合、必须显式接.sum()或.mean(),聚合方式始终写在明面上。缺失值处理上:某个“国家×年份”组合在源表缺失时,两者都在对应位置给出缺失值(pivot_table的fill_value默认不做填充);但pivot_table默认dropna=True,会把整年全缺失的列整列丢弃,unstack()则保留全部组合、缺失处留空;此外若用groupby().sum(),整组值都缺失时求和结果是 0 而非缺失值(求和会跳过缺失),这与pivot_table的表现又不相同。对本章数据的影响:平台数据中每个“国家×年份”组合只出现一次时,单条记录的均值就是它本身,mean与sum等价,两种写法结果一致;一旦源表存在同一国家同一年的重复记录或缺失组合,差异立刻显现——在6行迷你长表上实测,重复组合pivot_table默认取均值15、groupby().sum()得30,而全缺失的年份列一个被丢弃、一个保留为空列。因此读别人的宽表时,先确认它是怎么聚合、怎么处理缺失的。回扣本章:对应“本章新增的技能要点”第1条(长表转宽表是趋势分析的前置,转换的默认行为要先弄清)。
概念辨析:折线图上”稳步增长”与”波动上行”的判别标准是什么?为什么贸易趋势分析应同时看进出口两端?
参考答案(点开前请先独立完成)
解题思路:判别标准看局部回撤与斜率稳定性。“稳步增长”表现为逐期上行、即使回落也幅度小、时间短,各点围绕一条上行直线的离散度小;“波动上行”表现为趋势方向向上但存在明显的深回撤或大起大落,逐年变化率的幅度大。需要量化时,可用逐年变化率的标准差(波动性)对照趋势斜率(方向)来表述。同时看进出口两端的原因有三:其一,单边曲线分不清“对该伙伴的贸易量真在扩张”与“只是价格(如油价)在抬升金额”;其二,同一伙伴在出口图与进口图中的形态可能相反——例如对某伙伴出口稳步增长、从其进口却随商品价格大起大落,只看一边会把价格效应误读成需求变化;其三,进出口合起来才构成双边贸易关系的完整口径,顺差逆差的方向决定了贸易议价与政策风险。
回扣本章:对应“本章新增的技能要点”第4条(双色编码区分口径、同一伙伴在两幅图中并列对照,避免孤立解读单边数据)。
变式任务:把子图中的贸易伙伴换成另外两个国家,改造思路是什么?你会依据什么标准挑选国家(贸易规模、增速还是波动性)?
参考答案(点开前请先独立完成)
改造思路:先定标准、再换标签。挑选标准可以量化为三个榜单:按九年贸易总额排“规模榜”(
exp_country_table.sum(axis=1))、按期末与期初之比排“增速榜”(exp_country_table[2018] / exp_country_table[2010])、按逐年变化率的标准差排“波动榜”(pct_change(axis=1).std(axis=1))——三个标准挑出的国家通常不同,选哪个取决于分析目的(研究主力伙伴看规模榜、寻找新兴市场看增速榜、研究风险看波动榜)。代码上只动每幅子图里的.loc['…']国家标签与set_title的国名,其余行不变;国家标签要按平台数据的实际写法填写(如 “U S A”、“CHINA P RP”)。# 变式代码:先排三个选国榜单,再替换子图标签(其余行与@lst-ch25-platform-task一致) volume_rank = exp_country_table.sum(axis=1).sort_values(ascending=False) # ← 新增:标准一,九年出口总额排“规模榜” growth_rank = (exp_country_table[2018] / exp_country_table[2010]).sort_values(ascending=False) # ← 新增:标准二,期末/期初排“增速榜” volatility_rank = exp_country_table.pct_change(axis=1).std(axis=1).sort_values(ascending=False) # ← 新增:标准三,逐年变化率标准差排“波动榜” print(volume_rank.head()) # ← 新增:先看榜单,再决定替换哪两个国家 plt.figure(figsize=(15, 10)) # 与平台任务一致 plt.subplot(221) # 与平台任务一致 g0 = exp_country_table.loc['榜单选出的国家一'].plot(color='purple', linewidth=3) # ← 改动点1:.loc标签换成榜单选出的国家 g0.set_title('对某国出口的趋势', size=15) # ← 改动点2:标题同步换成该国国名 plt.subplot(222) # 与平台任务一致 g1 = exp_country_table.loc['榜单选出的国家二'].plot(color='purple', linewidth=3) # ← 改动点1:同上 g1.set_title('对某国出口的趋势', size=15) # ← 改动点2:同上结构性判读:2×2子图布局、紫色折线与纵轴单位都不变,变的只是曲线本身。判读要点:规模榜国家的曲线纵轴量级高、走势通常较稳;增速榜国家可能起点低但斜率陡;波动榜国家曲线锯齿明显。换国后先看纵轴刻度再比较形态,避免把“量级差异”误读成“增长快慢”。
本地演练版(模拟数据):在5国×9年的合成长表上实跑三种选国标准:
# 本地演练版:三种选国标准(规模、增速、波动性)各自挑出的国家不同 import pandas as pd # 导入Pandas数据分析库 years = list(range(2010, 2019)) # 2010—2018年,同平台数据区间 trade = pd.DataFrame({ # 5国×9年合成长表:甲国大体量稳增、乙国小体量高增、丙国大幅波动、丁国平稳、戊国温和增长 'country': ['甲国'] * 9 + ['乙国'] * 9 + ['丙国'] * 9 + ['丁国'] * 9 + ['戊国'] * 9, # 国家列 'year': years * 5, # 年份列 'value': [20000 + 800 * t for t in range(9)] + [500 + 350 * t for t in range(9)] + [9000, 4000, 13000, 3000, 11000, 5000, 14000, 6000, 12000] + [6000 + 60 * t for t in range(9)] + [3000 + 420 * t for t in range(9)] # 各国数值路径 }) wide = pd.pivot_table(trade, values='value', index='country', columns='year') # 与平台任务同型的国家×年份宽表 volume_rank = wide.sum(axis=1).sort_values(ascending=False) # 规模标准:九年贸易总额 growth_rank = (wide[2018] / wide[2010]).sort_values(ascending=False) # 增速标准:2018年是2010年的倍数 volatility_rank = wide.pct_change(axis=1).std(axis=1).sort_values(ascending=False) # 波动标准:逐年变化率的标准差 print('规模榜(九年总额)前两名:', volume_rank.index[:2].tolist()) # 依规模选国时会挑中的两个 print('增速榜(2018/2010倍数)前两名:', growth_rank.index[:2].tolist()) # 依增速选国时会挑中的两个 print('波动榜(逐年变化率标准差)前两名:', volatility_rank.index[:2].tolist()) # 依波动性选国时会挑中的两个 print(pd.DataFrame({'规模榜': volume_rank, '增长倍数': growth_rank})) # 三种标准并排对照模拟数据演练结果(本机 peter 环境实际运行结果,仅演示流程与判读方法,真实数值以平台运行结果为准):
规模榜(九年总额)前两名: ['甲国', '丙国'] 增速榜(2018/2010倍数)前两名: ['乙国', '戊国'] 波动榜(逐年变化率标准差)前两名: ['丙国', '乙国'] 规模榜 增长倍数 country 丁国 56160.0 1.080000 丙国 77000.0 1.333333 乙国 17100.0 6.600000 戊国 42120.0 2.120000 甲国 208800.0 1.320000演练判读:规模榜与增速榜挑出的国家完全不同(甲国、丙国 对 乙国、戊国)——先明确分析目的,再决定用哪个榜单选国,这一步应写在报告里而不是事后补。
预期输出:数据文件由教学平台内置,本机无法复现,具体数值以平台运行结果为准。
注意:以上为本题变式的独立代码;列表 25.2 对应平台任务的原始代码块仍须原样输入教学平台,不要用本变式替换。
回扣本章:对应“本章新增的技能要点”第2条(画单个国家趋势就是宽表按行取数,换国只是换
.loc的行标签)。变式任务:在透视表基础上计算2010→2018年的增长倍数并降序排序,得到”增长最快伙伴榜”——需要增加哪些步骤?
参考答案(点开前请先独立完成)
改造思路:在透视表之后增加三步:第一步,取宽表的2018列除以2010列得到“增长倍数”;第二步,按增长倍数降序排序;第三步,把期末值并排列出——只看倍数容易被“小基数高倍数”误导,期末值能标出体量。
# 变式代码:在透视表上增加“增长最快伙伴榜”三步 growth = (exp_country_table[2018] / exp_country_table[2010]).rename('增长倍数') # ← 新增步骤1:期末值除以期初值 growth_board = growth.sort_values(ascending=False).to_frame() # ← 新增步骤2:按增长倍数降序得到伙伴榜 growth_board['期末值'] = exp_country_table[2018] # ← 新增步骤3:并列出期末值,识别“小基数高倍数” print(growth_board.head()) # 输出榜单(进口方向对imp_country_table同样处理)结构性判读:输出是一张“国家×两列(增长倍数、期末值)”的排序表。判读要点:榜首未必是贸易体量最大的伙伴,小基数国家容易翻出高倍数,倍数与期末值要同时读;若某国在期初或期末年份缺失,相除会得到缺失值并被排序排到表尾,下结论前先确认数据完整性;出口与进口两张透视表应分别出榜,方向不能混。
本地演练版(模拟数据):在与第3题同一份5国×9年合成数据上实跑:
# 本地演练版:增长倍数榜单(数据与第3题演练一致) import pandas as pd # 导入Pandas数据分析库 years = list(range(2010, 2019)) # 2010—2018年,同平台数据区间 trade = pd.DataFrame({ # 同第3题的5国×9年合成长表 'country': ['甲国'] * 9 + ['乙国'] * 9 + ['丙国'] * 9 + ['丁国'] * 9 + ['戊国'] * 9, # 国家列 'year': years * 5, # 年份列 'value': [20000 + 800 * t for t in range(9)] + [500 + 350 * t for t in range(9)] + [9000, 4000, 13000, 3000, 11000, 5000, 14000, 6000, 12000] + [6000 + 60 * t for t in range(9)] + [3000 + 420 * t for t in range(9)] # 各国数值路径 }) wide = pd.pivot_table(trade, values='value', index='country', columns='year') # 与平台任务同型的国家×年份宽表 growth = (wide[2018] / wide[2010]).rename('增长倍数') # 新增步骤1:期末值除以期初值 growth_board = growth.sort_values(ascending=False).to_frame() # 新增步骤2:按增长倍数降序得到伙伴榜 growth_board['期末值'] = wide[2018] # 新增步骤3:并列出期末值,识别小基数高倍数 print('2010→2018增长最快伙伴榜(模拟数据演练结果):') print(growth_board) # 输出榜单模拟数据演练结果(本机 peter 环境实际运行结果,仅演示流程与判读方法,真实数值以平台运行结果为准):
2010→2018增长最快伙伴榜(模拟数据演练结果): 增长倍数 期末值 country 乙国 6.600000 3300.0 戊国 2.120000 6360.0 丙国 1.333333 12000.0 甲国 1.320000 26400.0 丁国 1.080000 6480.0演练判读:倍数榜首乙国(6.6倍)的期末值反而最低——高增速与小体量并存,如果只报倍数不报期末值,结论会被放大。
预期输出:数据文件由教学平台内置,本机无法复现,具体数值以平台运行结果为准。
注意:以上为本题变式的独立代码;列表 25.2 对应平台任务的原始代码块仍须原样输入教学平台,不要用本变式替换。
回扣本章:对应“本章新增的技能要点”第1条(透视表把长表重排成“国家×年份”宽表之后,按列取数做除法即可派生新指标)。
商业判断:若平台结果显示从中国的进口持续增长、而从沙特与阿联酋的能源进口随油价明显波动(具体数值以平台运行结果为准),对依赖这两类进口原料的企业,采购与库存策略应如何设计?
参考答案(点开前请先独立完成)
参考作答框架:本题不设唯一结论,优秀作答应覆盖以下维度。
- 口径先行:“随油价明显波动”按什么衡量(逐年变化率、滚动标准差,还是相对趋势线的离差);用金额还是数量口径——油价上涨会放大金额波动而数量未必变;数据以美元计价,汇率折算也会进入波动。金额口径的“波动”可能是价格现象而非供给现象。
- 分析依据:两类原料的性质不同——稳定增长的进口(工业品、中间品)供给可靠、价格平稳,适合长期协议与低库存周转;随油价波动的能源类原料,价格与供给双重不确定,需要分摊风险而不是押注单边。
- 策略框架:波动类原料可考虑多元供应来源、长约定价与现货组合、按价格区间分批补库(低价多囤、高价少囤但设上限)、用期货或长约锁价对冲,并把价格波动向下游售价传导的机制写进合同;稳定类原料以准时化补货与供应商协同为主,降低资金占用。
- 风险考量:高位囤货面临跌价与资金占用风险,能源类还有仓储安全与保质期约束;长约锁定在价格暴跌时变成负担;过度依赖单一稳定来源同样有集中度风险。
- 模型边界:平台数据止于2018年且为国家级贸易流,不含最新地缘政治、关税与航运冲击,也不等于企业自身的采购成本曲线;趋势外推只宜作基准情景。
- 还需补充的数据:原料成本在总成本中的占比、库存持有成本与仓储能力、供应商交期与履约可靠性、可用的套保工具与基差、替代供应商与替代原料的可行性。
- 常见错误作答形态:用单一国家的贸易趋势直接推出企业采购结论;只看金额不看数量;把“波动”一律当成风险而忽略低价窗口的采购机会。
回扣本章:对应“本章新增的技能要点”第4条(同一伙伴在出口图与进口图中并列对照,贸易结论须双边、双口径同时看)。